import qs from "qs";
import service from "./server";
// import { message } from 'antd';
// import NProgress from 'nprogress'; // 引入nprogress插件

class Request {
  service: any;
  nowhandle: any;
  state: string;
  constructor() {
    this.service = service;
    this.nowhandle = null;
    this.state = "ready";
  }

  parseRoute = function (name: string, urlOb: any) {
    const ob: any = (this[name] = {}); // 注册模块

    Object.keys(urlOb).forEach((item) => {
      ob[item] = this.sendMes.bind(
        this,
        name,
        item,
        urlOb[item].url,
        urlOb[item].option
      );
      ob[item].state = "ready";
    });
  };

  errorMessage = (status: number, info: string) => {
    alert("error");
    // switch (status) {
    //   case 400:
    //     message.error(info || '400（语义有误,当前请求无法被服务器理解)');
    //     break;
    //   case 401:
    //     message.error('登录超时');
    //     // setTimeout(() => {
    //     //   window.location.href = 'main.html#/login';
    //     // }, 1500);
    //     break;
    //   case 403:
    //     message.error('403（用户无权限访问该资源，请求失败）');
    //     setTimeout(() => {
    //       window.location.href = '#/main/403';
    //     }, 1500);
    //     break;
    //   case 404:
    //     // message.error('404 (Not Found)');
    //     break;
    //   case 500:
    //     message.error(info || '500（服务器内部错误）');
    //     break;
    //   case 502:
    //     message.error('502（网关错误）');
    //     break;
    //   case 503:
    //     message.error('503（服务不可用）');
    //     break;
    //   case 504:
    //     message.error('504（网关超时）');
    //     break;
    //   default:
    //     message.error('请求失败');
    //     break;
    // }
  };

  sendMes = function (
    moduleName: string,
    name: string,
    url: string,
    option: any = {},
    data: any = {}
  ): any {
    const type = option.type || "get";
    // 请求处理前
    const before: any = () => {
      // NProgress.start();
    };

    // 请求处理后
    const after = () => {
      if (option.needCancel) {
        this[moduleName][name].state = "ready";
      }

      // NProgress.done();
    };

    // 请求处理
    const defaultFn = (res: any) => {
      after();
      if (res.status === 200) {
        const result = res.data;
        if (result.success === false) {
          // success === false 为自定义
          this.errorMessage(result.code, result.message);
          return Promise.reject(result);
        }

        if (Array.isArray(result.data)) {
          if (result.data.length > 0 && result.data[0].constructor === Object) {
            result.data.map((item: any, index: number) => {
              const key = item.id ? item.id : index;
              return (item.key = key);
            });
          }
        }
        return Promise.resolve(result.data);
      } else {
        return Promise.reject(res);
      }
    };

    const state = {
      get: () => {
        const urlqs =
          Object.keys(data).length !== 0 ? url + "?" + qs.stringify(data) : url;
        return service.get(urlqs).then(before()).then(defaultFn);
      },
      post: () => {
        // if (Object.prototype.toString.call(data) === '[object FormData]') {
        //     headers = {
        //       'Content-Type': 'multipart/form-data'
        //     };
        //   }
        return service.post(url, data).then(before()).then(defaultFn);
      },
      delete: () => {
        return service
          .delete(url, {
            data: data,
            paramsSerializer: (params) =>
              qs.stringify(params, { indices: false })
          })
          .then(before())
          .then(defaultFn);
      },
      put: () => {
        return service.put(url, data).then(before()).then(defaultFn);
      }
    };

    // 防止多次提交
    if (option.needCancel) {
      if (this[moduleName][name].state === "ready") {
        this[moduleName][name].state = "pending";
        return state[type]();
      } else {
        this[moduleName][name].state = "pending";
        return new Promise(() => {});
      }
    } else {
      return state[type]();
    }
  };
}

export default new Request() as any;
